package pimmodel;
import java.io.Serializable;
import java.util.Observable;

/**
 * 
 * Die Klasse PimDaten.<br>
 * Die Oberklasse von Notiz,Termin,Aufgabe und Kontakt.
 * 
 * @authors (Torsten Mansfeld, Thomas Schoenfeld)
 * @version (20120902_01)
 * 
 */
public class PimDaten extends Observable implements IPimDaten, Serializable {

	// Serialisierungs-UID
	private static	final	long	serialVersionUID	= 1L;
	
	
	
	// Meldungskonstanten
	private	static	final	String	NAME				= "Der uebergebene Name ist kein gueltiger String.";
	private	static	final	String	IPIMDATEN			= "Das uebergebene Objekt ist nicht vom Typ IPimDaten.";
	
	
	
	// Instanzvariablen
	private 				String	name;
	
	
	
	// Konstruktoren
	
	/**
	 * Standardkonstruktor der Klasse PimDaten.
	 * Initialisiert die Instanzvariable name.
	 */
	public PimDaten() {
		
		this.name = "";
		
	}
	
	/**
	 * Konstruktor der Klasse PimDaten.
	 * 
	 * @param name		der Name
	 */
	public PimDaten( final String name ) {
		
		setName( name );
		
	}

	/**
	 * Kopierkonstruktor der Klasse PimDaten.
	 * 
	 * @param pimDaten	zu kopierendes Objekt des Typs PimDaten
	 * 
	 * @throws IllegalArgumentException falls das uebergebene Objekt nicht vom Typ IPimDaten ist.
	 */
	public PimDaten( final IPimDaten pimDaten ) {
		
		if ( !( pimDaten instanceof IPimDaten ) )
			throw new IllegalArgumentException( IPIMDATEN );
		
		setName( pimDaten.getName() );
		
	}
	
	
	
	// Getter und Setter Methoden
	
	/* (non-Javadoc)
	 * @see pimmodel.IPimDaten#getName()
	 */
	@Override
	public String getName() {
		
		return name;
		
	}

	/* (non-Javadoc)
	 * @see pimmodel.IPimDaten#setName(java.lang.String)
	 */
	@Override
	public void setName( final String name ) {
		
		if ( !( name instanceof String ) || name.trim().isEmpty() )
			throw new IllegalArgumentException( NAME );
		
		this.name = name.trim();
		this.setChanged();
		this.notifyObservers(this.name);
		
	}

	
	
	// sonstige Methoden
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	/* (non-Javadoc)
	 * @see pimmodel.IPimDaten#toString()
	 */
	@Override
	public String toString() {
		
		return "PimDaten [Name = " + name + "]";
		
	}	
	
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	/* (non-Javadoc)
	 * @see pimmodel.IPimDaten#hashCode()
	 */
	@Override
	public int hashCode() {
		
		final int prime = 31;
		int result = 1;
		result = prime * result + ( ( name == null ) ? 0 : name.hashCode() );		
		return result;
		
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	/* (non-Javadoc)
	 * @see pimmodel.IPimDaten#equals(java.lang.Object)
	 */
	@Override
	public boolean equals( final Object obj ) {
		
		if ( this == obj )
			return true;
		if ( obj == null )
			return false;
		if ( getClass() != obj.getClass() )
			return false;
		IPimDaten other = ( IPimDaten ) obj;
		if ( name == null ) {
			if ( other.getName() != null )
				return false;
		}
		else if ( !name.equals(other.getName() ) )
			return false;
		return true;
		
	}

	/**
	 * compareTo		erlaubt einen lexikographischen Groessenvergleich mit andererem Pim-Daten
	 * 
	 * @param			pimDaten	das zu vergleichende Pim-Datum
	 * 
	 * @return			-1, falls das aktuelle Pim-Datum lexikographisch kleiner,<br>
	 * 				 	 1, falls es groesser und<br>
	 * 				 	 0, gleich dem uebergebenen Pim-Datum ist
	 * 
	 * @throws IllegalArgumentException falls das uebergebene Objekt nicht vom Typ IPimDaten ist.
	 */
	@Override
	public int compareTo( final IPimDaten pimDaten ) {
		
		if ( !( pimDaten instanceof IPimDaten ) )
			throw new IllegalArgumentException( IPIMDATEN );
		
		return this.name.compareTo( pimDaten.getName() );
		
	}
	
}
